package com.makingTeam.server.controller.test;

import java.util.*;

/**
 * user: pzy
 * date: 2025/7/21 17:19
 * 使用前缀树实现文章中指定关键词的高亮显示
 *
 */
public class TrieHighlighter {

    private static class TrieNode {
        //子节点
        private Map<Character,TrieNode> children;
        //标记是否为关键词结尾
        private boolean isEndWord;
        //存储的完整关键词（isEndWord为true时才有值）
        private String word;

        private TrieNode() {
            children=new HashMap<>();
            isEndWord=false;
            word=null;
        }

        public Map<Character, TrieNode> getChildren() {
            return children;
        }

        public void setChildren(Map<Character, TrieNode> children) {
            this.children = children;
        }

        public boolean isEndWord() {
            return isEndWord;
        }

        public void setEndWord(boolean endWord) {
            isEndWord = endWord;
        }

        public String getWord() {
            return word;
        }

        public void setWord(String word) {
            this.word = word;
        }
    }

    //前缀树根节点
    private final TrieNode root;
    // 存储所有关键词，用于后续验证
    private Set<String> keywords;

    /**
     * 初始化高亮器
     * @param keywords
     */
    private TrieHighlighter(List<String> keywords) {
        root=new TrieNode();
        this.keywords=new HashSet<>(keywords);
        buildTrie(keywords);
    }

    /**
     * 构建前缀树
     * @param keywords 关键词列表
     */
    private void buildTrie(List<String> keywords){
        for (String keyword : keywords) {
            TrieNode current=root;
            for (int i = 0; i < keyword.length(); i++) {
                char c = keyword.charAt(i);
                current.getChildren().putIfAbsent(c,new TrieNode());
                current=current.getChildren().get(c);
            }
            //标记关键词结尾并存储完整关键词
            current.setEndWord(true);
            current.setWord(keyword);
        }
    }



    public String highlight(String word) {
        if (word==null || word.isEmpty()){
            return "";
        }
        StringBuilder result=new StringBuilder();
        int length = word.length();
        int index=0;

        while (index<length){
            //尝试从当前位置开始匹配关键词
            TrieNode current=root;
            int currentIndex=index;
            String methodWord=null;
            int maxMatchLength=0;

            while (currentIndex<length){
                char c = word.charAt(currentIndex);
                TrieNode trieNode = current.getChildren().get(c);

                //如果没有匹配子节点，结束
                if (trieNode==null){
                    break;
                }

                //移动到下一节点
                current=trieNode;
                currentIndex++;

                // 如果找到一个关键词，记录下来（可能有更长的匹配）
                if (current.isEndWord){
                    methodWord=current.getWord();
                    maxMatchLength=currentIndex-index;
                }
            }
            // 如果找到匹配的关键词
            if (methodWord!=null){
                // 添加高亮标记
                result.append("<span style=\"background-color: yellow;\">")
                        .append(methodWord)
                        .append("</span>");
                // 移动索引到关键词之后
                index+=maxMatchLength;
            }else{
                // 没有找到匹配，直接添加当前字符
                result.append(word.charAt(index));
                index++;
            }
        }
        return result.toString();
    }



    /**
     * 测试方法
     */
    public static void main(String[] args) {
        // 10个需要高亮的关键词
        List<String> keywords = Arrays.asList(
                "人工智能", "机器学习", "深度学习", "神经网络", "算法",
                "数据结构", "大数据", "云计算", "区块链", "物联网"
        );

        // 创建高亮器
        TrieHighlighter highlighter = new TrieHighlighter(keywords);

        // 生成一篇包含关键词的示例文章（模拟万字文章）
        String article = generateSampleArticle();

        // 处理文章，高亮关键词
        String highlightedArticle = highlighter.highlight(article);

        // 输出处理结果（实际应用中可能会写入文件或显示在网页上）
        System.out.println("处理后的文章（含高亮标记）：");
        System.out.println(highlightedArticle);
    }

    /**
     * 生成包含关键词的示例文章
     */
    private static String generateSampleArticle() {
        StringBuilder sb = new StringBuilder();

        sb.append("随着科技的发展，");
        sb.append("人工智能");
        sb.append("已经成为当今最热门的领域之一。");
        sb.append("机器学习");
        sb.append("作为");
        sb.append("人工智能");
        sb.append("的一个重要分支，通过各种");
        sb.append("算法");
        sb.append("让计算机能够从数据中学习。\n");

        sb.append("在");
        sb.append("机器学习");
        sb.append("中，");
        sb.append("深度学习");
        sb.append("尤其引人注目，它基于");
        sb.append("神经网络");
        sb.append("模型，能够处理复杂的模式识别任务。\n");

        sb.append("同时，");
        sb.append("大数据");
        sb.append("技术的发展为这些算法提供了海量的训练数据，而");
        sb.append("云计算");
        sb.append("则提供了强大的计算能力支持。\n");

        sb.append("除了这些领域，");
        sb.append("区块链");
        sb.append("技术和");
        sb.append("物联网");
        sb.append("也在快速发展，它们与");
        sb.append("人工智能");
        sb.append("的结合将创造出更多创新应用。\n");

        // 重复内容以模拟万字文章
        for (int i = 0; i < 10; i++) {
            sb.append(sb.toString());
        }

        return sb.toString();
    }
}
